<?php

declare( strict_types = 1 );

namespace App\Common\Model\Base\DataUnit;

use App\Common as com;
use App\Common\Model\Base as nameBase;
use App\Common\Model\Base\DataUnit as nameDataUnit;

class GetDataOfCache extends nameDataUnit\Base {

	/**
	 * 魔术方法->call
	 * @param string $name 方法名
	 * @param array $arguments 参数[]
	 * @return mixed
	 * @throws
	 */
	public function __call( string $name, array $arguments ) {
		// 取动作类型
		$action = substr( $name, 0, 3 );
		// 处理属性读写
		switch( $action ){
			case 'get':
				return $this->__magicCallOfGet( $name, $arguments );
			case 'set':
				return $this->__magicCallOfSet( $name, $arguments );
			default:
				throw com\Lib\Err\Exception::makeOfNew( '不存在的调用方式：' . $action, com\Cla\Err\Code::$sysFunExecuteError );
		}
	}

	/**
	 * 魔术方法->call->get(处理属性读写)
	 * @param string $name 方法名
	 * @param array $arguments 参数
	 * @return mixed||Exception 返回数据(如无法处理则抛出异常:com\Cla\Err\Code::$sysDataErrorSeverity)
	 */
	protected function __magicCallOfGet( string $name, array $arguments )
	{
		// 取出属性名
		$propertyName = substr( $name, 3 );
		$propertyName = com\Lib\Fun\Str::parseName( $propertyName, 1, false );
		// 检查可以读的属性
		$default = $arguments[0] ?? null;
		$isForce = $arguments[1] ?? false;
		return $this->getDataUnit()->goDataset()->getOfCache( $propertyName, $default, $isForce );
	}

	/**
	 * 魔术方法->call->set(处理属性读写)
	 * @param string $name 方法名
	 * @param array $arguments 参数
	 * @return mixed||Exception 返回数据(如无法处理则抛出异常:com\Cla\Err\Code::$sysDataErrorSeverity)
	 */
	protected function __magicCallOfSet( string $name, array $arguments )
	{
		// 取出属性名
		$propertyName = substr( $name, 3 );
		$propertyName = com\Lib\Fun\Str::parseName( $propertyName, 1, false );
		// 检查可以读的属性
		$value = $arguments[0] ?? null;
		return $this->getDataUnit()->goDataset()->setOfCache( $propertyName, $value );
	}

	/**
	 * 获取已缓存的数据
	 * @return array
	 */
	public function getCacheDatas(  ):array {
		return $this->getDataUnit()->gowDirectData()->getCacheDatas();
	}

	/**
	 * 刷新缓存
	 * @return $this
	 */
	public function refreshCache(  ):self {
		$this->getDataUnit()->gowDirectData()->refreshCache();
		//
		return $this;
	}

}
